[Flutter] ドロップダウンメニューで色を選べるようにする
こんにちは、CX事業本部 Delivery部の若槻です。
Flutterでドロップダウンメニュー(ドロップダウンリスト)を実装したい場合はDropdownButton
クラスを使用します。
今回は、このDropdownButton
で実装したドロップダウンメニューで色を選べるようにしてみました。
できあがったもの
やってみた
メニューアイテムにテキストを指定する
まずはよくある実装としてドロップダウンメニューのアイテムがテキストの実装です。これはドキュメントのExampleほとんどそのままの実装となります。
import 'package:flutter/material.dart'; const List<String> list = <String>['Red', 'Blue', 'Green', 'Yellow']; void main() => runApp(const DropdownButtonApp()); class DropdownButtonApp extends StatelessWidget { const DropdownButtonApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('DropdownButton Sample')), body: const Center( child: DropdownButtonExample(), ), ), ); } } class DropdownButtonExample extends StatefulWidget { const DropdownButtonExample({super.key}); @override State<DropdownButtonExample> createState() => _DropdownButtonExampleState(); } class _DropdownButtonExampleState extends State<DropdownButtonExample> { String dropdownValue = list.first; @override Widget build(BuildContext context) { return DropdownButton<String>( value: dropdownValue, onChanged: (String? value) { setState(() { dropdownValue = value!; }); }, items: list.map<DropdownMenuItem<String>>((String value) { return DropdownMenuItem<String>( value: value, child: Text( value, ), ); }).toList(), ); } }
メニューアイテムにアイコンも指定できる
メニューアイテムに指定するものはウィジェットのため、アイコンを指定することもできます。
class _DropdownButtonExampleState extends State<DropdownButtonExample> { String dropdownValue = list.first; @override Widget build(BuildContext context) { return DropdownButton<String>( value: dropdownValue, onChanged: (String? value) { setState(() { dropdownValue = value!; }); }, items: list.map<DropdownMenuItem<String>>((String value) { return DropdownMenuItem<String>( value: value, child: Icon( Icons.square, color: Colors.red, ), ); }).toList(), ); } }
そこでこのようにソースとなるリストをColorsクラスのオブジェクトで作成し、メニュー毎に色を変えるようにしてみました。DropdownButtonのvalueに指定できるのはString型となるため、ColorsクラスのオブジェクトをtoString()
により文字列型に変換した値(例:MaterialColor(primary value: Color(0xff4caf50))
)を指定するようにしています。
import 'package:flutter/material.dart'; const List<Color> list = <Color>[ Colors.red, Colors.blue, Colors.green, Colors.yellow ]; void main() => runApp(const DropdownButtonApp()); class DropdownButtonApp extends StatelessWidget { const DropdownButtonApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: const Text('DropdownButton Sample')), body: const Center( child: DropdownButtonExample(), ), ), ); } } class DropdownButtonExample extends StatefulWidget { const DropdownButtonExample({super.key}); @override State<DropdownButtonExample> createState() => _DropdownButtonExampleState(); } class _DropdownButtonExampleState extends State<DropdownButtonExample> { String dropdownValue = list.first.toString(); @override Widget build(BuildContext context) { return DropdownButton<String>( value: dropdownValue, onChanged: (String? value) { setState(() { dropdownValue = value!; }); }, items: list.map<DropdownMenuItem<String>>((Color value) { return DropdownMenuItem<String>( value: value.toString(), child: Icon( Icons.square, color: value, ), ); }).toList(), ); } }
メニューアイテムにコンテナを指定する
今回は横長の長方形の図形を表示したかったので、Containerクラスを使用しました。
class _DropdownButtonExampleState extends State<DropdownButtonExample> { String dropdownValue = list.first.toString(); @override Widget build(BuildContext context) { return DropdownButton<String>( value: dropdownValue, onChanged: (String? value) { setState(() { dropdownValue = value!; }); }, items: list.map<DropdownMenuItem<String>>((Color value) { return DropdownMenuItem<String>( value: value.toString(), child: Container( color: value, width: 50, height: 25, ), ); }).toList(), ); } }
以上